package com.shujia.day11;

public class Demo06MyException {
    // TODO 对于main方法 也可以进行异常抛出，但是一旦遇到问题，程序终止
    public static void main(String[] args) throws MyDefineException {
        /*
            TODO 如果想要定义一个自定义的错误类型
                 throw:通过该关键字可以 抛出一个异常的对象，让其产生错误
         */

        try {
            /*
                com.shujia.day11.MyDefineException: 这是自定义的异常
	                    at com.shujia.day11.Demo06MyException.main(Demo06MyException.java:11)
             */
            throw new MyDefineException("这是自定义的异常");
        } catch (MyDefineException exception) {
            System.out.println(exception.getMessage());
            exception.printStackTrace();
        }

        /*
            TODO 当在fun函数中定义了一个错误的发生位置，那么对于main方法中，并没有提示其错误
                 那么如何让main方法知道fun函数中可能会发生错误?

                可以使用throws对异常进行抛出，意思表达为当程序中出现问题，自己不处理交给调用方进行处理
                    由于在main方法中进行调用，那么就需要在main中进行处理
         */
//        System.out.println(3/0);

//        try {
//            fun(3, 0);  // 经过捕获之后就没有异常了
//        }catch (MyDefineException exception){
//            exception.printStackTrace();
//        }
        fun(2, 0);
        System.out.println("程序是否能打印改行？");

    }


//    public static void fun(int a, int b) {
// TODO 方法内不处理，交给调用方进行处理
    public static void fun(int a, int b) throws MyDefineException,NullPointerException {

        if (b == 0) {
            // 直接处理由于有 throw 执行到该处时肯定会发生错误，程序退出...
            throw new MyDefineException("除数不能为零,抛出异常，请检查逻辑");
        } else {
            System.out.println(a / b);
        }

        // TODO 方法内自行处理
//        if (b == 0) {
//            try {
//                throw new MyDefineException("除数不能为零,抛出异常，请检查逻辑");
//            } catch (MyDefineException exception) {
//                exception.printStackTrace();
//            }
//        } else {
//            System.out.println(a / b);
//        }


    }
}

class MyDefineException extends Exception {
    // 如果当遇到自定义的类型时，想要去打印自定义的信息怎么做
    //   打印信息 可以使用 getMessage()

    public MyDefineException(String message) {
        super(message);
    }
}
